package com.it.untils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 报案唯一ID生成工具类
 * 编码规则：REPORT + 日期（YYYYMMDD） + 6位序列号（000000-999999）
 */
public class ReportIdGenerator {
    // 日期格式化器（线程安全处理）
    private static final ThreadLocal<SimpleDateFormat> DATE_FORMATTER = ThreadLocal.withInitial(
            () -> new SimpleDateFormat("yyyyMMdd")
    );

    // 序列号计数器（原子类保证线程安全）
    private static final AtomicInteger SEQUENCE = new AtomicInteger(1);

    // 序列号最大值（6位最大为999999）
    private static final int MAX_SEQUENCE = 999999;

    // 上次生成ID的日期（用于每天重置序列号）
    private static String lastDate;

    /**
     * 生成报案唯一ID
     * @return 格式为REPORT+YYYYMMDD+6位序列号的唯一ID
     */
    public static synchronized String generateReportId() {
        // 1. 获取当前日期字符串（YYYYMMDD）
        String currentDate = DATE_FORMATTER.get().format(new Date());

        // 2. 检查是否跨天，跨天则重置序列号
        if (lastDate == null || !lastDate.equals(currentDate)) {
            SEQUENCE.set(1);
            lastDate = currentDate;
        }

        // 3. 获取当前序列号并自增
        int sequence = SEQUENCE.getAndIncrement();

        // 4. 处理序列号溢出（超过999999则重置为1）
        if (sequence > MAX_SEQUENCE) {
            SEQUENCE.set(1);
            sequence = 1;
        }

        // 5. 拼接ID（序列号补0至6位）
        return String.format("REPORT%s%06d", currentDate, sequence);
    }

    // 测试方法
    public static void main(String[] args) {
        // 生成10个示例ID
        for (int i = 0; i < 10; i++) {
            System.out.println(generateReportId());
        }
    }
}
